package com.example.controller;

import com.example.pojo.Result;
import com.example.pojo.User;
import com.example.service.UserService;
import com.example.utils.JWTUtil;
import com.example.utils.Md5Util;
import com.example.utils.ThreadLocalUtil;
import org.hibernate.validator.constraints.URL;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.validation.constraints.Pattern;
import java.util.Map;

/**
 * @Description TODO
 * @Author fantasy
 * @Date 2024/6/26 22:09
 **/

@Validated
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    /**
 * 处理用户注册请求。
 * <p>
 * 通过POST请求向此路径发送用户注册信息，包括用户名和密码。在注册之前，会检查用户名和密码的格式是否符合要求，
 * 然后检查用户名是否已被占用。如果一切检查通过，用户将被成功注册。
 *
 * @param username 用户名，必须是一个长度为3到16个字符的非空字符串，不能包含空格。
 *                 使用@Pattern注解来验证用户名的格式。
 * @param password 密码，必须是一个长度为5到16个字符的非空字符串，不能包含空格。
 *                 使用@Pattern注解来验证密码的格式。
 * @return 如果注册成功，返回一个表示成功的Result对象；如果用户名已存在，返回一个表示错误的Result对象，其中包含错误信息。
 */
@PostMapping("/register")
public Result register(@Pattern(regexp = "^\\S{3,16}$", message = "用户名格式不正确") String username,
                       @Pattern(regexp = "^\\S{5,16}$", message = "密码格式不正确") String password){
    // 根据用户名查找已存在的用户
    User user = userService.findByUsername(username);
    // 如果用户已存在，返回错误信息
    if (user != null){
        return Result.error("用户名已存在");
    }
    // 注册新用户
    userService.register(username, password);
    // 注册成功，返回成功信息
    return Result.success();
}

    @PostMapping("/login")
    public Result login(@Pattern(regexp = "^\\S{3,16}$", message = "用户名格式不正确") String username,
                        @Pattern(regexp = "^\\S{5,16}$", message = "密码格式不正确") String password){
        User user = userService.findByUsername(username);
        if (user == null){
            return Result.error("用户名不存在");
        }
        if (!user.getPassword().equals(Md5Util.md5Encrypt(password))){
            return Result.error("密码错误");
        }
        String token = JWTUtil.genJwt(Map.of("id", user.getId(), "username", user.getUsername()));
        return Result.success(token);
    }

    /*@GetMapping("/userInfo")
    public Result<User> getUserInfo(@RequestHeader(value = "token", required = true) String key){
        Map<String, Object> map = JWTUtil.verifyJwt(key);
        User user = userService.findByUsername(map.get("username").toString());
        return Result.success(user);
    }*/
    @GetMapping("/userInfo")
    public Result<User> getUserInfo(){
        Map<String, Object> o = ThreadLocalUtil.get();
        User user = userService.findByUsername(o.get("username").toString());
        return Result.success(user);
    }
    /**
     * 通过PUT请求更新用户信息。
     *
     * @param user 包含待更新用户信息的请求体。
     * @return 返回操作结果，如果更新成功，则返回成功的标志。
     */
    @PutMapping("/update")
    public Result update(@RequestBody User user){
        userService.update(user);
        return Result.success();
    }

    /**
     * 更新用户头像的接口。
     *
     * 通过此接口，用户可以更新他们的头像URL。此操作仅涉及存储头像URL的更新，
     * 不涉及实际头像图片的上传或处理。实际的头像更新逻辑由userService中的updateAvatar方法处理。
     *
     * @param avatarUrl 用户新的头像URL，必须是一个有效的URL。
     * @return 返回操作结果，如果操作成功，则返回一个表示成功的Result对象。
     */
    @PatchMapping("/updateAvatar")
    public Result updateAvatar(@RequestParam("avatarUrl") @URL String avatarUrl){
        userService.updateAvatar(avatarUrl);
        return Result.success();
    }
}
